package com.m1.tzolkin.model.players;

import java.io.Serializable;
import java.util.Collection;

import com.m1.tzolkin.model.IStartingWealth;
import com.m1.tzolkin.model.ITZStock;
import com.m1.tzolkin.model.ObservableModel;
import com.m1.tzolkin.model.buildables.IActionBuilding;
import com.m1.tzolkin.model.buildables.IMonument;
import com.m1.tzolkin.model.log.ILog;
import com.m1.tzolkin.model.util.player.ICardsPlayer;
import com.m1.tzolkin.model.util.player.IPawnPlayer;
import com.m1.tzolkin.model.util.player.IResourcesPlayer;
import com.m1.tzolkin.model.util.player.IScorePlayer;

/**
 * Un mod�le de joueur.
 * Un joueur est caract�ris� par ses ressources, son ma�s, ses cr�nes, ses points victoire...
 * Il poss�de �galement des fermes, des b�timents et des monuments,
 *  qui ont des effets sur sa partie.
 * 
 * @inv <pre>
 *     getCorn() >= 0
 *     getRessource(r) >= 0
 *     getSkulls() >= 0 </pre>
 *     
 * @cons <pre>
 * $DESC$
 *     Un nouveau joueur sur le plateau b avec des permissions initialis�es,
 *      des ressources et du ma�s � 0 et un nom s.
 * $ARGS$
 *     String s
 * $PRE$
 *     s != null
 * $POST$
 *     getName().equals(s)
 *     getCorn() == 0
 *     getRessource(r) == 0
 *     getSkulls() == 0
 *     getHandPawns().size() == getTotalPawns().size() == DEFAULT_WORKERS </pre>
 *
 */
public interface ITZPlayer extends IScorePlayer, ICardsPlayer<IStartingWealth>,
									ICornManager, IPawnPlayer<IWorker>, IResourcesPlayer<ITZStock>,
									ObservableModel, Serializable {
	
	// REQUETES
	
	/**
	 * Retourne true si le joueur est une IA.
	 */
	boolean isIA();
	
	/**
	 * Retourne true si le joueur est Premier Joueur.
	 */
	boolean isFirstPlayer();
	
	/**
	 * Retourne l'ensemble des b�timents d'action de ce joueur.
	 */
	Collection<IActionBuilding> getActionBuildings();
	
	/**
	 * Retourne l'ensemble des monuments de ce joueur.
	 */
	Collection<IMonument> getMonuments();
	
	/**
	 * Retourne le nombre de tuiles ma�s que ce joueur poss�de.
	 */
	int getCornTiles();
	
	/**
	 * Retourne le nombre de tuiles de bois que ce joueur poss�de.
	 */
	int getWoodTiles();
	
	/**
	 * Retourne true si le joueur peut avancer le calendrier de deux jours.
	 */
	boolean canTurnTwice();
	
	// COMMANDES
	
	/**
	 * Informe ce joueur qu'il est premier joueur ou pas.
	 */
	void setFirstPlayer(boolean is);
	
	/**
	 * Ajoute le b�timent d'action b.
	 * @pre <pre>
	 *     b != null </pre>
	 */
	void addBuilding(IActionBuilding b);
	
	/**
	 * Ajoute le monument b.
	 * @pre <pre>
	 *     b != null </pre>
	 */
	void addMonument(IMonument b);
	
	/**
	 * Ajoute une tuile de ma�s.
	 */
	void addCornTile();
	
	/**
	 * Ajoute une tuile de bois.
	 */
	void addWoodTile();
	
	/**
	 * Nourrit ses ouvriers et subit les �ventuelles cons�quences.
	 */
	void feedWorkers(ILog log);
	
	/**
	 * Permet ou pas � ce joueur d'avancer de deux jours.
	 */
	void setTurnTwice(boolean can);

}
